package cn.elead.chaos.framework.util;

import java.util.ArrayList;
import java.util.List;

import cn.elead.chaos.framework.web.enums.IEnum;

import cn.hutool.core.util.StrUtil;

/**
 * 枚举工具类
 * 
 * @author luopeng
 *
 */
public class EnumUtil {

	public static <E extends Enum<?> & IEnum<Integer>> E codeOf(Class<E> enumClass, int code) {
		E[] enumConstants = enumClass.getEnumConstants();
		for (E e : enumConstants) {
			if (e.getValue() == code)
				return e;
		}
		return null;
	}

	public static <E extends Enum<?> & IEnum<String>> E nameOf(Class<E> enumClass, String name) {
		if(StrUtil.isBlank(name)) {
			return null;
		}
		E[] enumConstants = enumClass.getEnumConstants();
		for (E e : enumConstants) {
			if (StrUtil.equals(e.getName(), name))
				return e;
		}
		return null;
	}

	public static <R extends Enum<?> & IEnum<Integer>> R codeOf2(Class<R> enumClass, int code) {
		R[] enumConstants = enumClass.getEnumConstants();
		for (R e : enumConstants) {
			if (e.getValue() == code)
				return e;
		}
		return null;
	}
	
	@SuppressWarnings("unchecked")
	public static <E extends IEnum<Integer>> List<E> of(Class<?> candidateClass) {
		List<E> list = new ArrayList<>();
		E[] enumConstants = (E[]) candidateClass.getEnumConstants();
		for (E e : enumConstants) {
			list.add(e);
		}
		return list;
	}
}
